/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.pec.manager;

import com.brain.core.manager.*;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;

import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.SessionMBean;
import com.brain.pec.dto.ExportarExcel;
import com.brain.pec.dto.ProcesoPecDto;
import com.brain.pec.view.ConstantesPec;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

/**
 *
 * @author Indra
 */
@Service
public class ProcesoPecManager extends ComunManager<ProcesoPecDto> implements Serializable {

    private static Logger logger = Logger.getLogger(ProcesoPecManager.class);
    private Long idEntidad = 700L;
    @Resource
    private DAOGenerico<ProcesoPecDto> springHibernateDao;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private ParametroManager parametroManager;
    private final String url = "/pages/pec/proceso/proceso.xhtml";
    private final String urlLista = "/pages/pec/proceso/listaProcesos.xhtml";
    
    private final String urlUnidadAnalisis = "/pages/pec/proceso/procesoUnidadAnalisis.xhtml";
    private final String urlListaUnidadAnalisis = "/pages/pec/proceso/listaProcesosUnidadAnalisis.xhtml";
    
    private final String urlMatrizKarjlic = "/pages/pec/proceso/procesoMatrizKarjlic.xhtml";
    private final String urlListaMatrizKarjlic = "/pages/pec/proceso/listaProcesosMatrizKarjlic.xhtml";
    
    private final String urlCaracterizacion = "/pages/pec/proceso/procesoCaracterizacion.xhtml";
    private final String urlListaCaracterizacion = "/pages/pec/proceso/listaProcesosCaracterizacion.xhtml";
    private final String urlListaCaracterizacionAll = "/pages/pec/proceso/listaProcesosCaracterizacionAll.xhtml";
    
    private final String urlPlaneamiento = "/pages/pec/proceso/procesoPlaneamiento.xhtml";
    private final String urlListaPlaneamiento = "/pages/pec/proceso/listaProcesosPlaneamiento.xhtml";
    
    /**
     * Metodo para obtener todas los catalogos
     *
     * @return lista de catalogos
     * @throws DAOException
     */
    public List<ProcesoPecDto> obtenerTodos() throws DAOException {
        return springHibernateDao.listarTodosDtos(ProcesoPecDto.class);
    }

    /**
     * Metodo para obtener un catalogo por su ID
     *
     * @param id ID del catalogo
     * @return Catalogo
     * @throws DAOException
     */
    public ProcesoPecDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(ProcesoPecDto.class, id);
    }

    /**
     * Metodo para obtener catalogos por filtros
     *
     * @param dtoFiltro filtros
     * @return lista de catalogos
     * @throws DAOException
     */
    public List<ProcesoPecDto> obtener(ProcesoPecDto dtoFiltro) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from ProcesoPecDto as e where e.id=e.id";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
            hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%' ";
        }     
        
        if (dtoFiltro.getCategoriaPecDto() != null && !dtoFiltro.getCategoriaPecDto().getId().equals(0L)) {
            hqsql += " and e.categoriaPecDto.id = ?";
            listaParametros.add(dtoFiltro.getCategoriaPecDto().getId());
        }  
        
        if (dtoFiltro.getCuadranteDto() != null && !dtoFiltro.getCuadranteDto().getId().equals(0L)) {
            hqsql += " and e.cuadranteDto.id = ?";
            listaParametros.add(dtoFiltro.getCuadranteDto().getId());
        }
        
        if (dtoFiltro.getCaracteristicaDto() != null && !dtoFiltro.getCaracteristicaDto().getId().equals(0L)) {
            hqsql += " and e.caracteristicaDto.id = ?";
            listaParametros.add(dtoFiltro.getCaracteristicaDto().getId());
        }
        
        if (dtoFiltro.getAgencia() != null ) {
            hqsql += " and e.agencia = ?";
            listaParametros.add(dtoFiltro.getAgencia());
        }
        
        if (dtoFiltro.getImpactoPresupuestal()!= null ) {
            hqsql += " and e.impactoPresupuestal > ?";
            listaParametros.add(dtoFiltro.getImpactoPresupuestal());
        }
        
        /*if (dtoFiltro.getAnalisisPecDto() != null && !dtoFiltro.getAnalisisPecDto().getId().equals(0L)) {
            hqsql += " and e.analisisPecDto.id = ?";
            listaParametros.add(dtoFiltro.getAnalisisPecDto().getId());
        }*/
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        hqsql += " and e.analisisPecDto.id = ?";
        listaParametros.add(sessionMBean.getAnalisisPecDto().getId());

        hqsql += " order by e.analisisPecDto.id desc,e.agencia desc,e.ranking desc,e.cuadranteDto.descripcion desc,e.unidadOrganicaDto.descripcion desc, "
                + "e.nucleoCompraDto.descripcion desc,e.categoriaPecDto.descripcion desc, e.descripcion asc ";


        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }
    
    public void generarExcelReporte(List<ProcesoPecDto> lstPV) {
        ExportarExcel.ProcesoPec exp = new ExportarExcel.ProcesoPec(Boolean.TRUE);
        StringBuilder strCabecera = new StringBuilder();
        List lstCuerpo = this.obtenerTramasExcel(exp, lstPV,strCabecera);
        
        String nombreArchivo = "RESUMEN_ANALISIS_" + UtilCore.Fecha.obtenerFechaActual().replace(":", "_") + ".xls";
        this.recursosManager.generarExcel(strCabecera.toString(), lstCuerpo, nombreArchivo);
        this.recursosManager.viewArchivo(nombreArchivo);
    }
    
    private List obtenerTramasExcel(ExportarExcel.ProcesoPec exp, List<ProcesoPecDto> lst,StringBuilder strCabecera) {        
        boolean indCabecera = true;
        StringBuilder strCuerpo;
        List lstFilas = new ArrayList();
        String delimitador = "|";
        for (ProcesoPecDto x : lst) {
            strCuerpo = new StringBuilder();
            
            if (exp.isAnalisisPecDto()) {
                strCuerpo.append(x.getAnalisisPecDto().getId()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("ANALISIS").append(delimitador);
                }
                
            }
            if (exp.isUnidadOrganicaDto()) {
                strCuerpo.append(x.getUnidadOrganicaDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("ENTIDAD").append(delimitador);
                }
            }
            if (exp.isNucleoCompraDto()) {
                strCuerpo.append(x.getNucleoCompraDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("LISTA NECESIDAD").append(delimitador);
                }
            }
            if (exp.isDescripcion()) {
                strCuerpo.append(x.getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("NECESIDAD").append(delimitador);
                }
            }
            
            if (exp.isCategoriaPecDto()) {
                strCuerpo.append(x.getCategoriaPecDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("CATALOGO OTAN").append(delimitador);
                }
            }
            
            if (exp.isCaracteristicaDto()) {
                strCuerpo.append(x.getCaracteristicaDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("AMBITO").append(delimitador);
                }
            }
            
            if (exp.isRanking()) {
                strCuerpo.append(x.getRanking().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("PONDERADO").append(delimitador);
                }
            }
            
            if (exp.isPesoFrecuencia()) {
                strCuerpo.append(x.getPesoFrecuencia().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("PESO X FRECUENCIA").append(delimitador);
                }
            }
            
            if (exp.isPesoTipoProceso()) {
                strCuerpo.append(x.getPesoTipoProceso().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("PESO X TIPO PROCESO").append(delimitador);
                }
            }
            
            if (exp.isPesoNivelPrioridad()) {
                strCuerpo.append(x.getPesoNivelPrioridad().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("PESO X NIVEL DE PRIORIDAD").append(delimitador);
                }
            }
            
            if (exp.isPesoCuadrante()) {
                strCuerpo.append(x.getPesoCuadrante().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("PESO X CUADRANTE").append(delimitador);
                }
            }
            
            if (exp.isPesoSecreto()) {
                strCuerpo.append(x.getPesoSecreto().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("PESO X SECRETO").append(delimitador);
                }
            }
            
            if (exp.isPesoCategoria()) {
                strCuerpo.append(x.getPesoCategoria().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("PESO X CATALOGO OTAN").append(delimitador);
                }
            }
            
            if (exp.isPesoMonto()) {
                strCuerpo.append(x.getPesoMonto().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("PESO X IMPACTO").append(delimitador);
                }
            }
            
            
            
            if (exp.isAgencia()) {
                if (x.getAgencia()) {
                    strCuerpo.append("SI").append(delimitador);
                }else
                    strCuerpo.append("NO").append(delimitador);
                
                if (indCabecera) {
                    strCabecera.append("SECRETO MILITAR").append(delimitador);
                }
            }
            
            if (exp.isCuadranteDto()) {
                strCuerpo.append(x.getCuadranteDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("CUADRANTE").append(delimitador);
                }
            }
            
            if (exp.isImpactoPresupuestal()) {
                strCuerpo.append(x.getImpactoPresupuestal()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("IMPACTO PRESUPUESTAL").append(delimitador);
                }
            }
            
            if (exp.isDificultadAbastecimiento()) {
                strCuerpo.append(x.getDificultadAbastecimiento().longValue()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("DIFICULTAD DE ABASTECIMIENTO").append(delimitador);
                }
            }
            
            if (exp.isTipoProcesoDto()) {
                strCuerpo.append(x.getTipoProcesoDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("TIPO DE PROCESO").append(delimitador);
                }
            }
            
            if (exp.isNivelPrioridadDto()) {
                strCuerpo.append(x.getNivelPrioridadDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("NIVEL PRIORIDAD").append(delimitador);
                }
            }
            
            if (exp.isFuenteFinanciamientoDto()) {
                strCuerpo.append(x.getFuenteFinanciamientoDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("FUENTE DE FINANCIAMIENTO").append(delimitador);
                }
            }
            
            if (exp.isFrecuenciaDto()) {
                strCuerpo.append(x.getFrecuenciaDto().getDescripcion()).append(delimitador);
                if (indCabecera) {
                    strCabecera.append("FRECUENCIA").append(delimitador);
                }
            }
            
            if (exp.isIndSecretoMilitar()) {
                if (x.getIndSecretoMilitar()) {
                    strCuerpo.append("SI").append(delimitador);
                }else
                    strCuerpo.append("NO").append(delimitador);
                if (indCabecera) {
                    strCabecera.append("SECRETO MILITAR").append(delimitador);
                }
            }
            
           
            lstFilas.add(strCuerpo.toString());
            indCabecera = false;
        }
        return lstFilas;
    }
    
    public List<ProcesoPecDto> obtenerParaListaParametros(ProcesoPecDto dtoFiltro, String tipo) throws DAOException {
        List<Object> listaParametros = new ArrayList<Object>();
        String hqsql = "select e from ProcesoPecDto as e where e.id=e.id";

        if (dtoFiltro.getId() != null && !dtoFiltro.getId().equals(0L)) {
            hqsql += " and e.id = ?";
            listaParametros.add(dtoFiltro.getId());
        }

        if (dtoFiltro.getDescripcion() != null && dtoFiltro.getDescripcion().length() != 0) {
            hqsql += " and upper(e.descripcion) like '%" + dtoFiltro.getDescripcion().toUpperCase() + "%' ";
        }
        
       

          hqsql += " order by e.descripcion asc ";


        return springHibernateDao.ejecutarQuery(hqsql, listaParametros);

    }

    

   
    /**
     * Metodo para inicializar los atributos de un catalogo
     *
     * @return Catalogo inicianilizada
     */
    public ProcesoPecDto inicializar() {

        ProcesoPecDto dto = new ProcesoPecDto();       
        dto.setAgencia(Boolean.FALSE);
        dto.setAnio1(BigDecimal.ZERO);
        dto.setAnio2(BigDecimal.ZERO);
        dto.setAnio3(BigDecimal.ZERO);
        dto.setImpactoPresupuestal(BigDecimal.ZERO);
        dto.setDificultadAbastecimiento(Long.valueOf(0));
        return dto;
    }
    
    public ParametroDto devuelveCuadrante(ProcesoPecDto p) {
        Long lx = null;
        BigDecimal ly = null;
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        try {
            lx = sessionMBean.getAnalisisPecDto().getLimDificultadAbastecimiento(); //parametroManager.obtenerPorId(ConstantesPec.Parametro.LIM_EJE_X).getValorEntero();
            ly = sessionMBean.getAnalisisPecDto().getLimImpactoPresupuestal();//parametroManager.obtenerPorId(ConstantesPec.Parametro.LIM_EJE_Y).getValorReal();        
        
        
     
        //cuadrante 1 o 3  1c3
        if (p.getImpactoPresupuestal().compareTo(ly) == -1 || p.getImpactoPresupuestal().compareTo(BigDecimal.ZERO) == 0) {            
            if (p.getDificultadAbastecimiento() < lx && p.getDificultadAbastecimiento() >= Long.valueOf(0)) {
                return parametroManager.obtenerPorId(ConstantesPec.Parametro.C1);            
            } else {
                return parametroManager.obtenerPorId(ConstantesPec.Parametro.C3);            
            }   
        }else { //cuadrante 2 o 4
            if (p.getDificultadAbastecimiento() < lx && p.getDificultadAbastecimiento() >= Long.valueOf(0)) {
                return parametroManager.obtenerPorId(ConstantesPec.Parametro.C2);                
            } else {
                return parametroManager.obtenerPorId(ConstantesPec.Parametro.C4);            
            }   
        }
        } catch (DAOException ex) {
            logger.error(ex);
            return null;
        }
    }

    /**
     * Metodo para guardar
     *
     * @param dto catalogo a guardar
     * @return Cadena de satisfaccion
     */
    public String guardar(ProcesoPecDto dto) {

        String to = null;
        String mensajeTrx = "";
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        ApplicationMBean applicationMBean = (ApplicationMBean) WebServletContextListener.getApplicationContext().getBean("applicationMBean");

        {
            dto.setUsuarioDto(sessionMBean.getSessionUsuarioDto());
            dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
            dto.setTerminal(sessionMBean.getSessionTerminal());
        }

        if (sessionMBean.getAccion() == applicationMBean.getNuevo()) {
            try {
//                dto.setCuadranteDto(devuelveCuadrante(dto));
                dto.setUsuarioCreacionDto(sessionMBean.getSessionUsuarioDto());
                dto.setFechaCreacion(UtilCore.Fecha.obtenerFechaActualDate());
                dto.setTerminalCreacion(sessionMBean.getSessionTerminal());
                UtilCore.General.toUpperCaseDto(dto);                
                nuevo(dto);
                sessionMBean.setAccion(applicationMBean.getEditar());
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);

                to = "";//retroceder();
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);

                to = null;
            }
        } else if (sessionMBean.getAccion() == applicationMBean.getEditar()) {
            try {
                UtilCore.General.toUpperCaseDto(dto);
  //              dto.setCuadranteDto(devuelveCuadrante(dto));
                editar(dto);
                mensajeTrx = UtilCore.Internacionalizacion.getMensajeInternacional("form.general.mensaje.transaccion.ok");
                recursosManager.showMessage(mensajeTrx);
                to = "";//retroceder();
            } catch (Exception ex) {
                mensajeTrx = ex.getMessage();
                recursosManager.showError(ex.getMessage());
                logger.error(mensajeTrx);
                to = null;
            }
        }



        return to;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        ProcesoPecManager.logger = logger;
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }

    public DAOGenerico<ProcesoPecDto> getSpringHibernateDao() {
        return springHibernateDao;
    }

    public void setSpringHibernateDao(DAOGenerico<ProcesoPecDto> springHibernateDao) {
        this.springHibernateDao = springHibernateDao;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ParametroManager getParametroManager() {
        return parametroManager;
    }

    public void setParametroManager(ParametroManager parametroManager) {
        this.parametroManager = parametroManager;
    }

    public String getUrl() {
        return url;
    }

    public String getUrlLista() {
        return urlLista;
    }

    public String getUrlUnidadAnalisis() {
        return urlUnidadAnalisis;
    }

    public String getUrlListaUnidadAnalisis() {
        return urlListaUnidadAnalisis;
    }

    public String getUrlMatrizKarjlic() {
        return urlMatrizKarjlic;
    }

    public String getUrlListaMatrizKarjlic() {
        return urlListaMatrizKarjlic;
    }

    public String getUrlCaracterizacion() {
        return urlCaracterizacion;
    }

    public String getUrlListaCaracterizacion() {
        return urlListaCaracterizacion;
    }

    public String getUrlPlaneamiento() {
        return urlPlaneamiento;
    }

    

    public String getUrlListaPlaneamiento() {
        return urlListaPlaneamiento;
    }

    public BigDecimal obtenerMontoSoles(ProcesoPecDto dto) {
        SessionMBean sessionMBean = (SessionMBean) WebServletContextListener.getApplicationContext().getBean("sessionMBean");
        
        if (dto.getTipoMonedaDto().getId().equals(ConstantesPec.Parametro.MON_EURO)) {            
            return dto.getMontoAsignado().multiply(sessionMBean.getAnalisisPecDto().getEuro());
        }else if (dto.getTipoMonedaDto().getId().equals(ConstantesPec.Parametro.MON_DOLAR)){
            return dto.getMontoAsignado().multiply(sessionMBean.getAnalisisPecDto().getDolar());
        }else {
            return dto.getMontoAsignado();
        }
        
        
        
    }

    public String getUrlListaCaracterizacionAll() {
        return urlListaCaracterizacionAll;
    }

   
    
}
